{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Mnist手写数字识别（基础作业）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-76cb8a8a3b54>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting .\\train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting .\\train-labels-idx1-ubyte.gz\n",
      "Extracting .\\t10k-images-idx3-ubyte.gz\n",
      "Extracting .\\t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\".\")\n",
    "#mnist = input_data.read_data_sets(\"MNIST_data/\", one_hot=True)  下载数据集\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "\n",
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量， 所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "定义用于训练的网络，首先定义网络的输入。"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])  #图像 x不是一个特定的值，而是一个占位符\n",
    "y = tf.placeholder(\"int64\", [None])      #标签 \n",
    "learning_rate = tf.placeholder(\"float\")  #学习率\n",
    "\n",
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)  #从截断的正态分布中输出随机值   shape表示生成张量的维度  stddev是标准差\n",
    "#L1 正则\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))  #权重  Variable代表一个可修改的张量  可以用于计算输入值，也可以在计算中被修改\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))      #偏置\n",
    "logits_1 = tf.matmul(x, W_1) + b_1                 #未经激活的输出\n",
    "output_1 = tf.nn.relu(logits_1)                      #使用ReLu激活函数激活输出\n",
    "#L2 正则\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "定义loss和用于优化网络的优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))  #logits未经激活的输出 softmax  softmax回归 #交叉熵损失 \n",
    "                                      \n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)  #优化器  梯度下降算法\n"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "将原始logits softmax 以便看到概率分布\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)  #tf.argmax(pred, 1)返回任意一输入x预测到的标签值 \n",
    "                                                #用 tf.equal 来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))  #准确率 cast 强制类型转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32     #一次迭代使用的样本量    与显存、内存有关 最好是2的整数倍，便于内存对其 不能超过数据总量的1/3\n",
    "trainig_step = 1000  #迭代次数\n",
    "\n",
    "saver = tf.train.Saver() #将训练好的模型参数保存起来"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "创建一个session，并将数据填入网络中,运行计算图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.360211, the validation accuracy is 0.8782\n",
      "after 200 training steps, the loss is 0.108571, the validation accuracy is 0.9024\n",
      "after 300 training steps, the loss is 0.406681, the validation accuracy is 0.9214\n",
      "after 400 training steps, the loss is 0.264371, the validation accuracy is 0.9336\n",
      "after 500 training steps, the loss is 0.261487, the validation accuracy is 0.9282\n",
      "after 600 training steps, the loss is 0.222232, the validation accuracy is 0.9416\n",
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.756174, the validation accuracy is 0.9366\n",
      "after 800 training steps, the loss is 0.312445, the validation accuracy is 0.9528\n",
      "after 900 training steps, the loss is 0.270632, the validation accuracy is 0.9498\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9476\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From G:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAd0AAAHiCAYAAACtERYWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XeYFEUaBvD328CSc5Scs6hgRAXMCXO6Q4LxPAPmjDl7Z86o6JkDmLOiKIiSgxJVQIJIkhwW2P3uj6rt7hpmdmd3Zno2vL/n4eHrqZqa6u1Q3VUdRFVBREREqZeR7goQERFVFGx0iYiIQsJGl4iIKCRsdImIiELCRpeIiCgkbHSJiIhCwkaXiIgoJGWu0RWR20Rkh4hsEpFqcX7ndxHZLiKvFpJHRWSziNydvNqGT0S+EZFtIjIu3XUpiYq+fEUkx877DhG5K931SQYu0/K1TEXkJbtsFsWZv4Od/zwROS9Gnr4ikm/zHZXUCieZiBxm65kvIocV9/tpaXRthYP/8kTk8WIU8ZaqVlfVzba8zyLK2y4iPxdkVtW2AO6Jo9weqnpToJ7DRWSe/eMOiTIfV4jIXyKyXkRGiEhOIK2ViHwrIltEZG5hC8dulCNEZIMt78pAWnMR+UlE/haRByO+97mI9Ap+pqqHALgwjnlNCTsvL4jIHyKyUUSmicjRxSwmcvleIyK/2PIWisg1wcwJLN/+ttxNIjJeRLpEzMfDIvKniKwVkadEJLuQ+S6srENtvZeLyBmBz2uLyFQRqRGYl1xVrQ7gtTjmJzQicomITBaRXBF5qQRFRC7Tfnb7WB9t511KlmnM7b+sL1MRqSsi79mDlj9E5J/FLOIBVW0VKC/mPkxV59v5H1tEmX/adeRzW6aIyE0istiW+6aI1Az8ZlMR+cDuG5eKSMz9XhxlXSMiq+260y3weW8ReT9Ylqp+bedncdF/pl2lpdG1f9jqtuKNAGwF8E4C5R0dUeb4RMoLmAHgIgBTIxNE5EgA1wM4FEArAG0A3B7I8gaAaQDqAbgJwEgRaRDjd24D0B5ASwD9AFwr/tHeDQD+B6A1gBMLGlm7oS9Q1ckln72UyAKwBEAfALUA3AzgbRFplUCZAmAQgDoAjgJwiYicmUglRaQ9zE7wQgC1AXwE4EMRybJZrgfQC0A3AB0A7AVgWAnLegRAf1v3p0Uk035+L4D7VHVjIvMSkj8B3AVgRJLK22zLuqaojPFK5jK1Ym7/KPvL9EkA22H2vwNg5qFrAuXdhtj7sJIaBGAggN4AdgNQBUDw5OxVAAth5uFYAPeISL/iliUiTQCcC7MPfwbAffbzLAAPArg8wflwlIbu5VMBrETRR0FxsTv3gwC8kmhZqvqkqo4GsC1K8mAAL6jqLFVdC+BOAENsHQo26FtVdauqjgLwM4BTYvzUIAB3qupaVZ0D4LmCsmAa229UdT2ASQDa2CO06wHcmOg8JpuqblbV21R1karmq+rHMBtGzwTKfEBVp6rqTlWdB+ADmI0nEUcCGKuq41R1J4D7ATSFOVgAzA71MVX9W1VXAXgMwDklLKuaqv6iqjNgdnT1RGQfAK1V9e0E5yMUqvquqr4PYE2Sypuoqq8AWJCM8qxkLtOitv8yu0zFdPGfAuBmVd2kquMAfAjTKJVUYfuwkuoPs49doqqbYJbnGSJSVUSqA+gL4G5V3WGXw0jEXp4xywLQAsA0Vd0A4GuYxhcwje2HqroowflwlIZGdzCAlzXwEGgRWSciB5awvEEwG97CpNQutq4wR8IFZgBoJCL1bNqCiKPdGfZzh4jUgTnyiiyrIO8vAA4XkdowR+mzYRr4R1R1XZLmJWVEpBHMWcWswGclXr4iIjAHVbOKyltUUfZf5HS3QtKbiUitEpS1UkR6iEgPAPkA1sKcKQ1NcB5KjQS32aRVA8lbpkUpy8u0A4A8VZ0f+Mzb54hIC7s8W8RTWBz7sJKKtrxyYM6oJfBZML0boiusrN8AdLf72MMAzBKR5gDOBPDfBOdhF2ltdO1C7QPTfepR1dr26KskBgF4KcGqxaM6gPWB6YK4RpS0gvQa2FX1iO9H5r0XppH5DqZLKBvA7gA+EpHXReR7EbmkpDORSna87DUA/1PVuQWfJ7h8b4NZb19MsHpfAegj5gKOSjC9BpUAVLXpnwG4TEQaiEhj+DvTqrsWVWRZFwJ4FMBwmLOJfwMYDaCyiHwhZmyzT5Ryy4wEl2myJHOZFqUsL9NC90+qutguz3jHLIvah5XUZwDOE3N9TC0A19nPq9oTmh8A3CwilUVkL5iz91jLsrCy1gC4G8A3MN3UV8Ms2+sAnCQi39mx42YJzg8AM/6WToMAjEvWWak90m4M081QWL7PYBoyAPiXqpbkAodNAGoGpgvijVHSCtKjjfNsCqRvi8yrqn8DOMPWOwPA9zAb/PUwZ8FDAEwVkW9UdXYJ5iMlbF1fgel6S8pBgT24GATgIFXNLSRfkctXVeeKyGAATwBoAjM+NBvAUpvlbphxwekAcmG6y/aEGQopVlmqOh2mK6xg/OhBAPvDHEhdDjNe+r2ItAz2+JAv7GValDK+TIuzf4q3vIIydtmHRSMimwKTXWJkGwGgOYAxMG3VgzDdxAXLcwDMicgSmGGK10palqq+AXMdDkTkWJj1Yxr8M/bjYc56E7qWBEh/9/IgRJzlJmgwgHdtn31MERdelfSKwlkAegSmewBYYY+aZsGMvdaISN+lS9SOBy+PUla07tMLAPykqr8A6A5gsqpuhxkvjtWtEjrbBfwCzAUOp6jqjiSUeQ7shWuqurSwvPEuX1UdqardVLUegFthLgKZZNO2quolqtpUVdvAjGVOUdW84pYV4WEAw1R1K/xluAimByPWhXYVXjqWaTGUtWU6H0CWvfCsQKx9TpGKuQ8r+E71wL+oZ9T2mpBbVbWVqjaz5S2z/6Cqf6jqcaraQFX3hblodWJJyiogIlVgrpq/CqbreYkd650E08OYsLQ1uiJyAMxFDsm4yrjgj3Uakti1LCKVRKQyTP9/tu3GKPibvQzgXBHpYsc0hhX8th0rmQ7gVvudk2AW2KgYP/UygGEiUkdEOgE4P3I+RKQhgIthulcBc3FSP3tBQS8k94KURD0NoDOA/nZHlBARGQCzIRyuqkmbTxHpKSKZ9qryZwF8VNANLuZ2hN3E2A/mKuxbS1JWIM/hACqrubgMMMvwEHvVaA6SdJFSKohIlt0WMgFk2vW6xD1lIpJhy8s2k1LZdgknWs9kLtPCtv+CPGVumaq5betdAHeISDUR6Q3gBCR28WmR+7DiEnNbU1u7vLoAeAjAHaqab9M7i0gNu5zOAnCEzVPssgKGAXhJVf+EuSWoo5jrUvohWftYVU3LP5gN4pUYaZtguhCjpd0G4NUon/8DwB8ApDjfC6QrgHYRn42xnwf/9Q2kXwlgBYANMGOMOYG0Vvb7WwHMA3BYIG0AgFmB6RyY7o8Ntrwro9TvZQCnBaabA5gAcwHHgxF5h8B026djuba0f6dtdjkW/BtQ0uULsyPbEVHeM0lYvuNgusD+tutjtUDawQAWAdhil9+AiO9+BuDGeMoKLOPpAFoGPjvU/sZyAGdG5H8JwF3pWIaFLJfIbeG2BJZp3yjljSlly3RMlDoGt/8yu0wB1AXwPsytW4sB/DOQ1sIuzxYxvrvLfCC+fdgYAOfFKLMvgKURn3Wwy2kLzL79yoj0ywGssvMwDkCviHRvnSyqLJunI8wZbVbgs2sArIYZpugekX8RAvv1uP/26V74JVhZhtk/8jpE7NgK+c48uwBGFJJnG8zg/53pnscE/z5f2Z3O6HTXhcu3RPOfY+d9M8wtZ2mvE5cpl2nE/Dxnl83vceZvb+d/C4AhMfIcDHOCsg7AkemexyLm51Bbz60A+hX3+2ILISIiohRL94VUREREFQYbXSIiopCw0SUiIgpJqA/HODzjNA4gp8lX+e9I0bmKh8szfVKxPAEu03TiNlq+xFqePNMlIiIKCRtdIiKikLDRJSIiCgkbXSIiopCw0SUiIgoJG10iIqKQsNElIiIKCRtdIiKikIT6cAyiVFh01/5enFfZfRZAg66rvPjHHrFeZwy0/eZsL64xsYqT1uix8YlWkYgIAM90iYiIQsNGl4iIKCRsdImIiELCMV0qk9Z+0t6Lf9njibi+s6OQR7/P7fe8F7/Wq4mT9vZXfbw4b86vcdaQShPp2dWZ/uTDV7y4+zOXeHHzOzl+H7bM2rW8eN4Tbbw4uE0CwLCVPb345wEdnLS82fNTVLvk45kuERFRSNjoEhERhYTdy1QmBLuTAeCHPd6M63vPrPO7qx768XAvbtVylZPvyy7vevGAGsudtLuH1PfiNtexe7ksWrl3TWd6J/K8uOqffOVsOuW3bubFP/d91osjh4PuajjFi3ucdICT1pzdy0RERBSJjS4REVFI2L1MpdbOQ/2rFb/p8WREarYXPbLWv5Lx2zN6udn+XOmFHdZO9uKMypWdbPdM6O7FN9b/2a1HnZ1x15lKp7W75znTS3fmenG9F34MuzoVWlbzZs506+G/pakm6cEzXSIiopCw0SUiIgoJG10iIqKQlOkx3TXn7+9Mtxjojw3MXdnISdue648BNn3Dj6su3eTky58+O5lVpARsalrJizMijg+D47hjjvfHY/MWzIur7N9u39OZfr3ug4GpHCet2ec8Ni2LtPceXjz2uIectD7fX+rF7TAttDpVVItv8W/x6XmUu499oMnYYpdX/QD3lr8lN/vl15/pX4NR5YOJxS471bg3ISIiCgkbXSIiopCU6e7la6953Zk+pdpaf6JtIV/s64eLdm5xkh5d1S/xisVp4sqWXlztwVpOWtboKZHZK5zaL/u3cpw6+SwnTdZu8OKdyxcVu+zzjvnama6ekRMjJ5VVf3ep4sVNMqs6aU1HZkdmpxSa+a/HvXiH5hWSMz5jerzmftDDD9/b7L+wZMTGE51sWd+kf7/KM10iIqKQsNElIiIKCRtdIiKikJTpMd3HbjzTmb5ld/8Yos4c9xUVazuLF1fafZ0XP9DtXSffw00mePEnW6p78bFV3VuLCrNVt3vxhNxqXty38g43Y+C32p3xLyepw+i4f65CSMZLqhfd7d9idm7t/0ak+o+FvGr5fk5Kja/n+PVIuBYUlkMv8q8JeH9zbSet+hj/1jIu09TIHuOPrWZLZsLlTdue78WLdjRw0k6q9rcXn17df/Tr6a8Md/Id17Qn0o1nukRERCFho0tERBSSMt29XG3khIjp2Hlrxvj88cZ9nem7erfyv/Od/4SrB/q2i7teWVv9bpBqM/0Xotf7fpSTr3ulwJOxFvEWhlRYN9DvUv5hkN+lXCvDfcvQj7l+99f0u9ynVVXZUPqeakO7yuza0Zm+p+EbXvzCBvfNNnnr1odSp4pk64n7ONNnN3nHi4O3CcV7y1C30Rc60w1G+7f15ax3y7ihr3/++PNpj8Usc+kN/pOrmt07Pq56JBvPdImIiELCRpeIiCgkZbp7ORl2/rXCma42yp8OdmBUG7mmROWvOM/v3uxayf1z//dvvzus1YsL3HqV6Nco0uq9/KvYI7uUgwaPOc+LO7zP7uSyaNnh9WKmTdnYMuKTramtTAUR7NK/6yH3SuFelbYHc8YsI/gEqWHfnuLFna+d6+TL27ABsXT81X8BysTj/e18n5xtTr7P/v2AFx9R+VonrdU9/tOqNDc35m8lime6REREIWGjS0REFBI2ukRERCGp8GO6qZDVsrkXP3HjE14c+VSWdx49zIvrLf8RlLjtX7ljdz92Cr6c3h/r6fHjYCdf56t+92I+oahs2tBlR8y06U/s4UzXBre3ZMgPXKfijuHGds4fRznTG8/w3wbVYal/PUVxtsPgE+suesm/1Wjyvx5x8jXJ9H9r6rlu2inv+vsEnTEHqcIzXSIiopCw0SUiIgoJu5dTYO4VTb147xz/RQuztru3KdSdvSW0OpVnWW1aefGd7d5x0uoEbhOaErgLoOWdbudV3tq1KakbpVbu0Xt78QdHPO6k3bHaf7h93VEznbR8UJhuXNHLizec597albf016T+VqtRq7345hPdl5fc13hSUn+rJHimS0REFBI2ukRERCFh93IS5B67tzM99dSHA1P+Q7r/fdllTr4q4/nko2Ro+/YyL96zUuzjyH8EHqDeYUb6u5kocUsP8Xdhu1dynzg2eFF3L2642X26ESVfYe/MnblX8P3mye1O3oX4Q3pZGe5AQmF1/PN2P258YtJr5eGZLhERUUjY6BIREYWEjS4REVFIOKabBIuPdo9dqos/jvuPhYd7cdXPZzj5FFRSawf7b2+6vVHwqVM5Tr7Bi/ynfnW+9jcv5lOnyocG3VZ6cZ6643dZH9QJuzoVzrx/V/XieF9On2qLTvZvSRrZwL1uZodmBmK3vrvd6sepvKWMZ7pEREQhYaNLREQUEnYvl1BGjRpePPCgcU7ahnz/xckr72njxTm5vE2lpLKa7uZMHzR0ghdXz8iJzO75cXY7L+6wln//8iCrtf9Si/929J9A9tz65k6+uiP4UoNUG3bQR2n53azmzZzpjT39/cMzZz8VVxkTc91bzGT7zsQrFgee6RIREYWEjS4REVFI2OgSERGFhGO6JfTrbV29+OP67hjCCb+e4sU5n3IcMRnm3OiO173fOPpYUr+fT3OmeZtQ+fPrv/zxu/0Cw/nnT+3n5GuOX8KqEoVs9u2NnelZRzwR1/dGbarvxU9f7e4rKs8J57G8PNMlIiIKCRtdIiKikLB7OU7rz3JfhjzzjMe8+PedO5y0Tff7l7PnYHlqK1ZBTDn+4YhPot8mVOsi91kyO/ly+nInv/m2qJ9vXVc56udUPmSPaeLF9zYZVaIyXlp2gBdX/ig9b3njmS4REVFI2OgSERGFhN3LhQg+Benym99y0nLE/9OdOWOgk9bgM16xnC47GtVyprO3Ny12GXmrVjvTmpvrxZLjd2tnNqiPWPIa1Hamf72qUly/rXn+C7g7Xfqbk5a3YUNcZZR3T+37atTPm34W+wXllBqZ4g/nFPaC+A3/3C9m2u13vODF/apEHzqILH/XlyvEt+z1kGVx5UslnukSERGFhI0uERFRSNjoEhERhYRjuhEky/+T9Ph4qRefVn2Nk++1jQ29uNHN7rFLKl+ATIX7ZOSIhMs4YNo/nOnVK2p6cZ0GG714Qs/XE/6twnQZdokz3ebaivnWnG3993GmD6wcvNWDu7B0uu+tU7349HMfiZnv+/886cWFvex+h8b3u4WVEdRt9IXOdHtMje8HUohnukRERCFho0tERBQS9s1E6tHRC+9s+ErMbE/e4z8su/aMitntF6YTZg9wpkd3G5my3xq/5xsl+t4W3e7FOzT2IMMxM4d48frpsW87ajounJdql3aLj3f7HIO3692xursXV/9gipMvzp5KSkCbt/zb6yae5T4RbJ+c2Lf/JCryBfTD/+rjxWsv8l+G0GlhxG13KatR/HimS0REFBI2ukRERCFho0tERBSSCj+mm9mlgzN9wZsfRM3XZcTFznSrV35KWZ1oV1WOXOhMd73Hv51G41yLa3T624uLc7tP17Fn+7+1uFrMfG1GbvInJv4cM18d/Bo1Jl9mTf82ret6fxoz3+ufHezFbXby2oqw5c2e78W3XHmek7akv39dw/yjn03q7140wr0VqPnd4wNTpfvNYjzTJSIiCgkbXSIiopBU+O7luRfVcab7V43+JpdmY7a7HyhvSEin1jcm1pV4HHrG/1uYmdBvUfHlB97sNHvLbk7aYct6eXH7e2Z5cWm4HaQiq/KB+1L4DoGRuoP/4Q/PZQ9Z4eT7vKv/BrcjfjnTi/NfaujkU/8FXGg1fZWTVpaWPc90iYiIQsJGl4iIKCQVsns5+AD10f0fjEitGm5liGgXGuhentfLTauEP7y4LHUrVmQ13wjc7RHxwLeT4O+Pq2FBIGUBYinLy51nukRERCFho0tERBQSNrpEREQhqZBjun/2zvTiFlmxx3CDL6rP3uDeMsQbhoiIqLh4pktERBQSNrpEREQhqZDdy4W5d00XL/7xyFZerMtjP8CeiIgoHjzTJSIiCgkbXSIiopCw0SUiIgpJhRzTbXO9/4aaY67fq5Ccf6W+MkREVGHwTJeIiCgkbHSJiIhCIsqXsRMREYWCZ7pEREQhYaNLREQUEja6REREIWGjS0REFJIy3+iKyEsisl1EFsWZv4OIbBKRPBE5L0aeviKSb/MdldQKJ5mInGvrqSLSLt31SZSI3CYiO+w8VYvzO7/bdeDVQvKoiGwWkbuTV9vki2f9LGu4jZavZcptVHLsvO8QkbuK+/1S1eiKSHsR2VbYgonhAVVtFaW8uiKySkTGFXymqvNVtTqAsUWU+aeqVlfVz21ZIiI3ichiEdkgIm+KSM3AbxXsWDYF/mVGK1hEBovIFFvOUhF5QESyAumPiMhaEflRRJoGPh8gIo8Gy1LVF+z8lBoicomITBaRXBF5qQRFvGX/9pttef1E5FsRWR9tx62qbQHcE0e5PVT1pkA9+4vIL3ZZjReRLoG0HBF5WET+tMviKRHJLuoH7LLV4M5VRP4pIstFZKGI9A183tb+rreeFGP9TIsyvo3WFZG3RGS1/fdaMD2iXpVEZKSILLLLs29EeplepiLSWUS+sdvUbyJyUjGLiNxGa4vI/0Rkpf13WzBzirbRM0Vknp2Hlfb3oy5Pm3+4zZ8vIkMi0g61y3K5iJwR+Ly2iEwVkRqBecm1y/O1OOZnF6Wq0QXwJIBJSSzvfgBzklTWIAADAfQGsBuAKgAej8jzgF0RC/7lxSirKoDLAdQHsC+AQwFcDQAisg+AngAaAxgH4Ab7eS2b55YkzU8q/QngLgAjklTeZlvWNUkqDyLSHmajuRBAbQAfAfgwcPBzPYBeALoB6ABgLwDDiiizDszymhX4LAvAffb7lwJ4IvCVxwBcWch6UhqV5W30LgB1ALQB0BZAIwC3FVLeOABnIeLRdGV9mdr6fwDgYwB1AVwA4FUR6ZBAsQ/D7NdaAdgHwEAROTvBeha1jf4AoLeq1oJZplkwyziWGQAuAjA1StojAPoDOArA04GDpnsB3KeqGxOZl6BS0+iKyJkA1gEYnaTy9ofZYb6YjPJgFsgLqrpEVTfB7CzOEJGqxS1IVZ9W1bGqul1Vl8GsWL1tcmsA41Q1F+Zv0cZ+fjeA/6jq+oTnJMVU9V1VfR/AmiSVN1FVXwGwIBnlWUcCGKuq41R1J8zybAqgj03vD+AxVf1bVVfB7EzPKaLMe22+1YHP6gFYpqrLAXwNuzxF5FT7+U/JmqFUKwfbaGsA76vqBrsdvQega7SC7Lb5iKqOAxDZgJb1ZdoJ5qDkYVXNU9VvYBqwgQmU2R/mpGOLqi4C8AKK3l6KUug2apdzcFvLAxBziE1Vn1TV0QC2RUmupqq/qOoMANsB1LMnQK1V9e0E58NRKhpd2yVwB4CroqS1EJF1ItKiGOVlwhyRXwIgWU//EPsvOJ0DoH3gs4tE5G8xXcenFKPsg+GfHc0CcJCIVIE5A54lIr0AdFTV10te/dLDLs8D010N7Lo8BaYRiJXezPY47FqY2UB7AXgmImkVzAbcDMDhMMuzOsxZ8w2JzkRYysk2+iSA40Skju2VOAXAZyX4nbK+TCXGZ928iZJto5F/+26xMhajvMK2UYjIgSKyHsBGmOX5SAl/a6WI9BCRHgDyAay1ZQ0tYXkxlYpGF8CdsEeokQmqulhVa6vq4mKUNxTABFWdkrQamo3zPBFpZXe819nPC46iH4PZuBsCuBnASyLSe9diXLYLpheA/wKAqv4CYBSAnwC0gDm6exTAUBEZKiLf27Go2smbtXDZ5Tmu6Jwp9RWAPmIuyKkE4EYAleAvz88AXCYiDUSkMfyNb5eeDduAPAXgUlXND6bZ6X8DGAkzPHA+TOP1OIDuYsaqvxCRRHdQqVYettGpMMt4jf2XB7PciqUcLNO5AFYCuEZEskXkCJizR2/dLsE2+jmA60WkhpgLOs9BlG2lmIraRmHPgmsBaAbgPwAWlfC3LoTZzw6HOeP/N0yPTmW7LL8VkT6FFRCvtDe6IrIHgMNgxgSSUd5uMBv0TUXlDXwnePFTrKP1EQDeADAG5mz0W/v5UgBQ1amqukZVd6rqpzBdxicX8bsnwowNHR3sJlHVh1W1h6qeAeAMmAswMmDGXg6FGQO7Pt75q2hE5LPA8hwQLY+qzgUwGGY8bjnM+Pps2OUJ050/DcB0AOMBvA9gB8zOKtJFAGaq6o9R0qCqo1V1P1XtA3MU3QvASwBeATAEpkF7vvhzGo7yso0CeAfAfAA1ANQE8DuA4l4QBqBsL1NV3QHgRADHwoxXXwXgbfh/p5IYCmArgF9hxovfKKy8JG2jwbzLYBr+N0tSeVWdrqp9VXVf+xvnwFz49TyA2wGcDeAVEYnWS1AspeHVfn1hBt8X2/mpDiBTRLqoamHv3YtlHwBNAMy25VUBUEVE/gLQNNoFDpFX/4pImyh58gHcav/BHh0us/+iUUTvxin4jaMAPAfgWFX9OUaeRgD+BWA/mDGTmaq6Q0QmAbgsVtkVnaoeHWe+kTBnK7A9B+fAXiSkqlthuj4vsekXAJgS4wKZQ2GOyI+x03UB7Ckie6jqJQWZ7Ab7BMwOqj6ATFX9w66buxd7RsPTF+VjG+0B4KLAFbfPwFwsVWJldZmq6kz41y9ARMYD+F8C5f0NwGs8ReQeABMLyZ/wNhpFFswFcol6GMAwVd0qIt0BTFbV7WLuXmiA6AfecSsNje5wuEcnV8Ns4P8uYXmf2e8XOAPAPwGckMgVhSJSF+bKxwUAOgN4CMAdBd2J9iKKzwFsgTkrOAumoYxW1iEwZ8InqWrMFdP+xq2qukVEFgLY244d9UVyLypKKjFXF2YByITZOVcGsNNeDFGS8jJgupWyzaRUBpCvqtsTrGdPmDPZujA7zo/s0TXE3KqlMEfY+8IMGZwbo6ghACoHpt+F2VG8EJHvPADTVHW6/RtVEXMLRAuU4uWJcrKNwuyszxORa+30BTBXtMYqLwf+gXMlu97lqjpviSmTy1QxcmWjAAAgAElEQVREdoc568+A6alpAnOmXtLy2sJcZLcOwBEwf9uEu2OL2EYHwPQCLoH5e9+NQi7ys13UGTDLNNsuz+3BISERORxAZVX92H60EMAhIrIE5vqAhC8OTXv3sr3a7a+CfwA2AdhmrxgtuEijsC6lyPJyI8pbD2CHjRNRH8CnMLevfAZghKoOD6RfBnNEvQ5mbOF8VR0TYx5uBlALwKeBLhbngg4R6Qegtqq+Z+drIoBPYFawfjDd0qXVMJiuputhDj62InC7jZ3fg4pR3sG2jE9hNq6tAL5MQj0fhVle8+z/5wfS2sJ0K2+GOQO4XlW937TdYzcCgKqui1jntgMouEK2IH99mHXkZvudnTBn0d/AXHx1aRLmJyXK0TZ6DkxjvxRmW20Dc8AEOx+zIro658Gsa00BfGHjloH8ZXaZwoxbLoc5azsUwOFq7pgAUKJttCeAn2EuaLoXwABVnVX4V+JS2DbaBWYb3QRz9fW8YHpwG7W+hFmGB8AcSG6F2bcU5M+B2XcHexEvhVmWX8P0kiR+K5iqlul/MF20mwD8Hmf+9nbhbQEwJEaegp38OgBHpnsei5ifs209twFok+76JGF+hsHsNNfBXMYfz3fm2XVgRCF5tsHs3O9M9zwWMS9Frp9l7R+30fK1TLmNIsfO+2aYnshifZ/v0yUiIgpJ2ruXiYiIKgo2ukRERCEJ9erlwzNOY192mnyV/07C95dF4vJMn1QsT4DLNJ24jZYvsZYnz3SJiIhCwkaXiIgoJGx0iYiIQsJGl4iIKCRsdImIiELCRpeIiCgkbHSJiIhCwkaXiIgoJGx0iYiIQsJGl4iIKCRsdImIiELCRpeIiCgkbHSJiIhCwkaXiIgoJGx0iYiIQsJGl4iIKCShvsS+tMjrt5cXXzL8bSft6fbtUva7G8/Yz5muPX21X6d5v6Xsd6l41g3a35mecN/TXtzlyYu8uMX9E518unNnaitWzmW1bO7FDd9a58XfTeni5Ov0lJ+WN2te6itmZTZo4EyvOdrfV9R5a6oXa25uaHWisodnukRERCFho0tERBSSCtm9/MeROV5cN3NTaL/717HbnekdA/1jnrrHhVYNiiKr6W5efOctz8fMN/vip7z46McOctJ048bkV6wcy2rcyJm+Y8woL+6Yne/Fh6xp7OTLm/VraisWEOxSHjBuqpO2X+X3vPjin//lJ0yblfJ6lWWZ9es50/MebuHFfdv7y3ZZnx1OvvLSbc8zXSIiopCw0SUiIgoJG10iIqKQVJgxXcmu5MWHHDI9LXWoMa2yM336ud958be1mzlpeevWh1InMlYe2dKLj6i6I2a+vSaf4cUNNs1PaZ3Ko6xmTb241ltbnLTdK2V6ccevL/Ti9oPdsdQwzbmrlRefXv1zJ22vR6714t2mjQ+rSmXSyksO8OJbL3vZSTu26pdRv3Ni/f7O9M5lfya/YmnAM10iIqKQsNElIiIKSYXpXt54kv8UqseaPu7Fnd+/xMnXHhNSVofcOupMD60z14vH1OjsZmb3ckplVK3qTB85dFxc38t5s44/oRo7I0W1trf/1Kn3Wz0ZM1/nYSu9OMznfOn+PZzp34571ov7/Hyak9Z8hL/95qW2WmVSZoe2Xvz8VY948R6V3GYnH9Etf7qGM93kX/6tYzuX/5V4BdOEZ7pEREQhYaNLREQUEja6REREISm3Y7raew9n+sn7H/XiVzf4t4d0Gube9pHKsZn9j/glhaVTceQe4I6h39XwhZh5t+T7j++s+fpPKatTeRR8cxAArDphW8y8vf57qRc3XhLeLTjBcdxhr/0vZr5Nn7iPo6y2ZkHK6lQezLnev/4heDtYvCb0fN2Znv+jvx2e/MqVTlqbu6d5cf622OtYacAzXSIiopCw0SUiIgpJue1eXnuD+7SbZln+jQdXXnqsF2evnZLSemQ18bukXmzhPtFmh/KYJ10Wnhx/d9epv54YmCofT8UJy5JHqzvTv+7zkhcPW+kOATV90X87T5i34CzrW82Le+e4N7B0Gz/Yi1s8zqdOFSazSwdn+utDHwlMVfGi+9e4QzuT1/lvGXqrrbuPDOoQeKrgcwOedtLuH3GCF+cv/COu+qYL9/pEREQhYaNLREQUknLVvbzm/P29+J3u/3HSXl6/uxdnf53aLuWg2Xf4V2/uULfTbPCiw7w4b+Wq0OpEwLF7z4iZtj5/qzO94zb/ZesZ7F4uFlVxpoPbwIQ1rZy0zK0rkSoZNdynG827u4sXv3/8Q16cj2wnX4vTfk5Zncqb1fu4L6dvleU/9e2CJQd78dL9Njn5Mqr5Q4E9L/SvYL/6/LedfANq+OvHwe67Y/DRqMVePPvY0v3kKp7pEhERhYSNLhERUUjY6BIREYWkXI3pZpy42ot3y8px0l54/SgvbobUXvqf2bWjF796qP+Wklx1X46++CH/Evtqual7uxEZucfs7cVPNH0uZr6lEa+1yfhuWvSMlJBPO73vTJ87pp8XL97YxIu3v+A+CSpefx3kvwXqmH2nO2kf7vZUYMofx+09/UwnXx38WqLfrojy3F0u8uH//Wc+292L6+JHN9/mzV7c5EF/3/x2/72dfP+o8bE/oe6tXSty/TF73ZYbf6XTgGe6REREIWGjS0REFJIy3b2c2aCBMz2swycx8za7J7ynycy9qLYX98rxb5F4cm0XJ1+1UexSDtOKvbOLzgSg/8eXO9PtweVUUg0fr+JMfzvcv9ejXxX3wfQvtPjWizPg32qU/5CiJJwyELuMNzb6t4TVuzG+F6zTrmqcsjxm2voj/S7kui/GV94tLT+M+CT2OeLYaZ28uMPaifH9QJrwTJeIiCgkbHSJiIhCUqa7l6Wq+1iSI6uu9+J9Jg1y0hpjTih1AoD6rf6O+vlrC3u5+TA/aj5KjUp7ro2ZNme7/1ScTo+tdtLCfPh+eZP1jfv0t0cPPMSL7zyglZO29Ai/C/i3/s948cRc96lWZ315YVy/3f5l/yrWT94ZETPfA7OP9OKmM2bFzEeF2ziqiftBVz8c0sUfovl+732cbKv29F+Kocf5+85u2W438Zwd/t0fXQMvPwCA945+3Iuv2+98P+GnmUVXPGQ80yUiIgoJG10iIqKQsNElIiIKSZke083/e50zfeeqvbz4n20nO2nfN2nrxcl+80RWy+bO9A97vBmY8o9rtv5UP+KbHNNNtW3H+eNHk/cOvvjafYn9vB0NvThv/u+prlaFtfOvFV5c9d0VTlqHd/34mAv3QiwdEN8tIRm7+7eRBG8fAoC7Vnfz4paX+deCRDyMjIqh8YcLnen5N2z34mvqzfbi6953r6+JdTvXGb8f60xvHerfInrSG2OctLNrLvHi34f6+9y2PxVR6TTgmS4REVFI2OgSERGFpGx3L2/c6Ex/uczvThq7x+tO2vKPa/lpz+6P4lrXxe0Cqd7K75Lab7dFbr1iPMdGSvZgHUrA1vp+N3K2ZMbMd+2Uk724NUrfbQZUfItv9Zd3ZBfml3f7L1WvvqQU9kGWQZHDdhdc4z/Z7cX/PuTFHbKruV8MvLyg3Zf+7T6dLpnrZMvf7HdR3/dNfyft3BP9oaP7e/njFM/3cLuo82eEd+toLDzTJSIiCgkbXSIiopCw0SUiIgpJmR7TjVTndv+xkH1u+4eT9l63l7z4/lvdlyjHY3KuOx6YFzhe6VVpe0RuQTQtHv/ZmeYbTFIv98R1UT8PPvYRAJo9H98biKj0Wn2Be63GzP2e9OJFO7c6aVVWRW6zlGzV3/Ef/Xg2rvTiv093t71t63O8uPM1/u16eYGX20fqeP1sZ/rQ9v41GV91HeXFt97qnlc2PRlpxzNdIiKikLDRJSIiCkm56l7GRL/7ttYxbtLAvkO9eF37HBRXvedid0kve7erMz1l35ei5ou8xYmSL7NDW2d68t6vBlO96LNN3Zx82V+7b8OhsmfL4Ztipp06/TxnuuG3U1NdHQoIdjVXfyd2vnjf6BW5L93wXmB7DuyO7999lJPvqSZ9vTjZTyaMF890iYiIQsJGl4iIKCTlq3u5EJlj/O6kemOSW/bWRTXcD/aNnk977+FMyw/Tk1sRwop+DZ3pWE+heuLbw53p9pgQNR+VHc/2fMWZXp7nXyVb75GqYVeHQtTgWf8lGPse/U8vntDTfTLhZVe38uK2V7F7mYiIqFxjo0tERBQSNrpEREQhqTBjuikV8QCqjBjHMhzDTb1tdaM/DQwApuT6TyHqfP9SJ40vLy+blt5wgBf3znFvA/op1x/HzeQtQuVbvn+zUb0H/eW++hX3SWRzzvSfUtb/9UFOmk6ZlaLKuXimS0REFBI2ukRERCFh93IyRLycPtZL7Cn1Gh6yLGbahxv29OK8VavDqA6l2IB/jPbiyBfVnzt5iBe3hPuykcx6df2JhvW8MG/Or8mtIIUu47tpXtz3f9c4abPP8buXN97tdj3XPM2/9TOVTw/kmS4REVFI2OgSERGFhI0uERFRSDimmwT5lWOP4a7Kyw2xJhWT5PhvjTphtxkx863ZXt2LNZfLpbzLz/PPKVZecoCTdux5Y734/QVNvLg0vOSckqfd8CXO9CunNfbi77uPdNKO6nGOF2eMS93tnTzTJSIiCgkbXSIiopCwezkJXj3qGWd6zna/u/kfL13rxS0wPrQ6VSh5/tNohs850Em6/IBFXjxmSTsvbopwnj5D6TPn4Be9OP9g93airt/7XYntbtvsxfG+RJ3Khp1L3CfPvX1SHy8e+PVbTtrqa7Z5ccNxqasTz3SJiIhCwkaXiIgoJOxeToI7Fh7vTG9+qqkXtxjFLuVU053+6wpaXb/ZSet870Avluk1QOXLFzf53YWzb2jipP04oZMXd3r0Tyet7V/zvDhv2zZQxRB84tgZC45w0j7a83kvPne/i/yEn2YmtQ480yUiIgoJG10iIqKQsNElIiIKCcd0k+FQ97L0algaIyOlWt5vC53pFqelqSIUisofTfTiVR+5ae3wkxfvBJFry0nubWQTxu/mxWs7VvPiOj8hqXimS0REFBI2ukRERCFh9zIREVU4eavXONPDO7Tx4jr4MWW/yzNdIiKikLDRJSIiCgkbXSIiopCw0SUiIgoJG10iIqKQsNElIiIKiahq0bmIiIgoYTzTJSIiCgkbXSIiopCw0SUiIgpJmW90ReQlEdkuIovizJ8jIptEZIeI3BUjTysRUZvvgqRWOMlEpIOtZ56InJfu+iRKRG6zy2aTiFQr+huAiPxu14FXC8mjIrJZRO5OXm1TI575KUtKsI0WuU6LSF8Rybf5jkpqhZNMRM619VQRaZfu+iSqom+j8bQhhSkVja6IjBGRbXZGNonIvGIW8YCqtooo8zARmWoX4hIROR0AVDVXVasDeC2Ocmur6nBb3oBA/TaJyBa7kvS06f1E5FsRWR/PzkVEzhOR32xZn4vIboG0f4rIchFZKCJ9A5+3FZHxIpJZ8JmqzrfzMzaO+QmFiHQWkW/s3+I3ETmpmEW8parVVXWzLa+2iPxPRFbaf7cFM6tqWwD3xFFuD1W9KVDP/iLyi10G40WkS8R8tBGRj0Vko4isFpEHYhUsIofY9W2DiCwIHqyJSA8RmWXLuCLwebaITBCR5iWcn9CISF0Rec9uT3+IyD+LWYSzjdod1wj79/pLRK4sSCvGOv2nXU8+t2WKiNwkIottuW+KSM3AbzYVkQ9E5G8RWSoiFxYyv8FGveDf4ED6IyKyVkR+FJGmgc8HiMijwbJU9QU7P6WKiJwpInPsMv1dRA4qxtedbdSWt5eIfG//VitE5LKCtJJsoyJyUMTfv+DA5RSbLiJyl4gss/uaMSLStZD5bWX30VtEZK6IHBZIO9Tub5eLyBmBz2vb7bpGYF6K04bsolQ0utYldiFWV9WOiRRkd56vA7gJQC0AewCYkkiZqvpaoH7VAVwEYAGAqTbLZgAjAFwTR/36wKyAJwCoC2AhgDdsWhaA+wDsBeBSAE8EvvoYgCtVNS+ReUklW/8PAHwMM28XAHhVRDokUOzDAKoCaAVgHwADReTsBOvZHmajuRBAbQAfAfjQ1h8iUgnAVwC+AdAYQDMAUY/SRSQbwHsAnoVZ384A8JCI9LBZ7gVwNYAeAIaJSGP7+ZUARqnqkkTmJSRPAtgOoBGAAQCeLmwHF4fbALQH0BJAPwDXSuJnrIMADATQG8BuAKoAeDyQ/irMttYIwLEA7hGRfoWU92dwm1fV/wGAiOwDoCfMejEOwA3281owy/mWBOcj5UTkcAD3AzgbQA0AB8Psz0paXn0An8NsA/UAtAPwZSJ1VNWxEfvc4wBssr8DAKcBOAfAQTD7mh8BvFJIkW8AmGbrdxOAkSLSwKY9AqA/gKNg1u2CE5t7AdynqhsTmZeg0tToJtMwAM+q6mequlNV16jq70n+jcEAXlZ7z5WqTlTVVxDfitsfwDuqOktVtwO4E8DBItIWZoVYpqrLAXwNoA0AiMip9vMkv1I56TrB7PAeVtU8Vf0GwA8wO8OS6g9zprRFVRcBeAFmY0vEkQDGquo4Vd0JswNqCqCPTR8Cs9N9SFU3q+o2VZ0Zo6y6AGoCeEWNSQDmACg4c24N4BtVXQbgVwAtRKQFgFNgDihKNTFdiKcAuFlVN6nqOAAfIrFlOgjAnaq6VlXnAHgO5m+eiP4AXlDVJaq6CWaZniEiVUWkOoC+AO5W1R2qOgPASJRsPWoNYJyq5gIYDbuNArgbwH9UdX2C8xGG2wHcoao/qWq+qi6z62dJXQngC3tykquqG+1yTabBAEYGzq4LlsMCeyLyKvxtzmEP+vcCcKuqblXVUQB+hlmvAaCaqv5i14vtAOrZg6vWqvp2MmeiNDW699rutx/E7VJtISLr7E4qXvvZ7/5suwteFZG6yaqoiLSEOTJ8uaRF2H/BaQDoBmAVzAJvBuBwALPsDmMY7BF1KScxPuvmTZjleWAC5TrllVC0ZRAsdz8Ai0TkM7tejhGR7tEKUtUVMEfRZ4tIpojsD3MGN85m+QXAEXaZtgLwO0yvxbWquiPB+QhDBwB5qjo/8NkMAF2B4m+jIlIH5sBsRrTyEhBtmebAnFFL4LNgemHrUUPbTbpQRB4Wf/xyFoCDRKQKgENhttFeADqq6usJzkPK2bO4XgAaiBn+WSoiT9j5KchT3G10PwB/ixmmWSkiHxVzn11UnasCOBXA/wIfvwmgnZhrALJhGuXPo30fZt1aEHHGGlznVooZBuoBIB/AWpiz36HJmocCpaXRvQ7maLEpgOEAPrJnfVDVxapaW1UXF6O8ZjBH4afAbHCR3UyJGgRzlrSwhN//FMDpIrK7XdFvAaAAqqpqPoB/wxyFXw3gfAB3wNS/ux2T+EJEEm10UmUugJUArhEzZnkEzNlj1YIMdnmOi1VAFJ8DuF5Eaoi5EOWcYHkl9BWAPmLG7ioBuBFApUC5zQCcCdM47gbgEwAf2LzRvAGzHHNhxiJvCnQbXw2zTD8EcAVM9+dGAAvEjDF+JyKnJTg/qVQdQOTZ23qYbsmSbKMF45vBMr3yEvAZgPPs2F0tmP0KYLarjTA9LjeLSGUR2Qtm/xBrPZoLMyzVBMAhMN3JDwGAqv4CYBSAnwC0gDmjfhTAUBEZKmZc8zURqZ3g/KRKIwDZMI3YQTDzuSfMgT2AEm2jzWAavctg/ibekFmSnAJgNYDvAp8th9nW5gHYCtPdfMWuXwVQxDoMM8z0KEz7MxBmex0NoLLd335rhwUTVioaXVWdYLsjcu24yQ8AjkmgyK0AXrQXZGyCGT+NWZ6Yi1wKBurjuZhgENwjrmJR1dEAboXZcP8AsAhmJ7y0IF1V91PVPjBHXb0AvAQzXjEEpjv6+ZL+firZM7cTYcbM/gJwFYC3YeethIbCLNNfYcaL3yisPHt2WrA8B8So51yYncQTMBtvfQCzA+Vuhem6+swOAfwXpuu/c5Tf6wTgLZj1ohLM0fO1InKs/a0/VPUYVd3L1v8OmIb4v/Z7x8OMASetNybJNsF0nwfVhFlnS1peQRlxlSfuxTSxzqBGwKwbY2DORr+1nxcs0wEwXZJLADwNM6YfdT1S1b9Udbbtel0I4FqYRqog/WFV7aGqZ8CM4Y+F2Z9eAHP2OwfA9bHmJ8222v8fV9Xlqroa5oAi0X3ue6o6SVW3wXRfH2APfnYRzzYawRnOs24FsDeA5gAq29/8xp4VRyp0HVbV6araV1X3hdkPnAPTbjxvyz0bwCsiEq0nr1hKRaMbhSJ6N2W8Ztoy4vsx1a6BAftCr5gUkYKLNEYmUD+o6pOq2l5VG8I0vlkw3ZDB3xKYRmEoTKOQqap/AJgEYPdEfj+VVHWmqvZR1XqqeiRML8bEBMr7W1UHqGpjVe0Ks97GLE9Vjw4sz5hXGKrqSFXtpqr1YDbgljB/W6B461A3APNU9Qu7k54Hc2Z8dJS8twB43nZJdwcw2Y4BLoW5+KQ0mg8gy158VqAHTMNWbKq6FuZAp0fg40LLU/eCpqhn1PZvf6uqtlLVZra8ZfZfwcHPcarawO5c6yH+9TLqPklEGgH4F8yBVDcAM+2BZ6ndRu3ffymKsY+MQ+T2UhBH3Y/Hu40CgJir+/ti1+G8HjBXUS9Vc+3OSwDqIPq47iwAbSRwFTJir3MPAximqlvhb6OLYHoHGkTJXyxpb3TFXJJ9pO3yybJHPQcD+CKBYl+EGV9rY496roO5mjYZBsNcceoclYtIhohUhlkwYucnalekTesmRguYLo1H7cYQdB6Aaao6HcAaAFXEXJndDwlcaZhqttu8spgLWK6G6aJ7KYHy2opIPTteejTM2USx74+LUm5PW2YDmKsuP7JnwIC5KGM/MbeeZQK4HKZ7K9rFIdMAtBdz25DYoZHj4I5ZFlxV3xfmLAswXXCH2B13ewDFGUIJjb1w5V0Ad4hINXvgeQIKv1K0KC/DXMldx/YUnI8E1hHAu62prV0GXWDO3u6wQzYFt7LVEJFKInIWgCNsnmhl9RUzVi12p38fTC9FpIdgLs7ZArM89xb/oq1Su43C7CMvFZGGYsbYL0di+8gXAZwkInuIGV+9GaanaF0S6joQwHjd9WLYSQBOE5FGdv87EGb/+1tkAfZ6hOkAbrX7ppNgDopGBfOJuaq7sqoW/C0KttGuMNcHrEl4blQ1rf9gjhwmwZzmr4MZJzk8kN4CpmugRYzvvwTgriif3w5zUdIqmJ1DnXi+Z9NawRypZUV8XtnW8dAo3+lrvxP8NyaQPgvAABvXhjky3AzTBXsvzFlssLz6MGe+NQOfDbD5FwHoF5F/DIDz0r08bV3+A3MhwiaYcbZ2EembABwU47u3AXg14rPTAfwJYAvMhnNkPN+LSNco9Rhn17u/YRrdahHpJ8NswBvs37drIO0zADdG1PEX+MME9wPIiCjvWwD7BqZ7wHRlrYa5FSzu+UnDMq0L4H27zi4G8M9AWrG3UZgd2Aj7t10ROf9FrdN2e1sa8VkHmPG9LTDDNpF/08th9geb7bLvFWu9hLkad5ktawnMNRU1IvL3A/BJxGeP2HX/JwDNiloH07g8swE8BbM/+wvm2oXK0f4WUb4bdd2EGQddZuf/IwDNi7NOx/r7wIyvnxvl88owt7Itt+vRVABHBdKfAfBMYLqVXae22vXksCjr5HQALQOfHQqzv10O4Myi1uu4/vbpXvhJWHmesyvI73Hmz7Er2maYI9RoeVoC2GbznZ/ueSxiftrbem4BMCTd9UnC/Ayzy2YdIhrBQr4zz64DIwrJsw3mwok70z2PyZifsvSvBNtokes0TG/YVptvl4Ow0vQPZjxwnV0H26S7PkmYnwq9jcbThhT2j6/2IyIiCknax3SJiIgqCja6REREIWGjS0REFJKsMH/s8IzTOICcJl/lv5PwTd2RuDzTJxXLE+AyTSduo+VLrOXJM10iIqKQsNElIiIKCRtdIiKikLDRJSIiCgkbXSIiopCw0SUiIgoJG10iIqKQsNElIiIKSagPxyAiooono2pVL+453nkVOW5tMN2Lj5h9shdXOvyP1FcsDXimS0REFBI2ukRERCFho0tERBQSjummQFbjRl68vf1ucX0ne/4yZ3reDW28uPZs/7nZdedsc/JljJ1WkioSlRnb+u/jTFf5bKoXa68uXrzw+GpOvoMO+dmLx37TPWb5TX7M8+LKH00scT3JFRzHnT+8oxe/32C4ky8/EC+Z0cSL24JjukRERJQANrpEREQhYfdyCa0/az8vXnOM2+V7/Z6fe/Ggmp/GVd4L61s40yfXeM+L65xWOeb3jmvaM67yiUq7zPr1vDjvrSpe/Gb7h5x8K/KyvbhWxhgvbpFVFTEN/j5m0sqztnjxn49VctL+dc9lXlzvuR9jl0+7WHBTDy+e3e8xLx6w4Ggn35q7W3tx289/Sn3F0oxnukRERCFho0tERBQSdi9HyOjR2YvnXupfDTn2iEecfA0yJ/nfScKxy7m1Fkd8ErtLmag8mv+oP8Qyr9MLgRS327hhph8/ta6DF0/d6A7RLN1cO+ZvZYp/zewnHT+KWjYAvDXsP1584ZxLnLSMcdNBsW1vuDPq5zPHtnemW39esbrteaZLREQUEja6REREIWGjS0REFBKO6UbY3LqGF88/+ulASpVdMyfomXX+U6de+2PvEpVRC78lqzrlXsYe/tOLtjV2n1606ET/qV+n7jPJSduh/kDft6/4T0dq8t16J59Om5WUelYUun8PZ/qtA54NTPm7ps+3umO6910z2ItrzFrtJ6z628mXsXZJ7N/O8Jdphwcv8uLZpz/u5GubXd2Ltw7b4KTVGuI/eW7nXyti/lZFlV19uxdvzPfjFl/lpqM6pQbPdImIiELCRpeIiCgk5bZ7OatZU2d6znXNvLjReL8rseYb7hNQMnLVi+fv8LtElux0bz9onrXOi4f8MthJWzvHf7JOo0l+ebXHu29BGgEAACAASURBVN1dummTF9dax27iZNDeezjTCy7249f3f86Le1aKuDckXtf4D8TfevV2J2n4Or/7+qkZfZy09ufO8eL8be4TzCqqHbXcpz/tUcnfHeXD326uefEcJ1/z98Z7cR5KKN//Zrsr/H1A50rubUEzT3jUi7/rPtJJ632Y3y1d61V2L2e2a+1Mzzp4hBdf9uehfr5vp6Ii45kuERFRSNjoEhERhYSNLhERUUjK1ZhuZu1aXrzPJwudtPfrf+jFvSe74zZBOZ/5t4tcc+wQL86bNc/9rc7+o8zqzvvdSaubPz9q2dEfikYlkX+gP3a7yB9awye9n3Tytc0K3urlj+N+tdW9BezG2Sd68brF7vj9Lyf6t5HcvMJ/u9QDjSc7+XpU8V+6/dA+bzlpN1wxxIub3TseBORVlphpu48f4sUt7g7v79X+4gnO9MeH+S9VP636Gidt3fGbvbjWq6mtV1kw77bYj90MU+7R/u2XG5vHbuIaTHFvAdMp4dzyxzNdIiKikLDRJSIiCkmZ7l7OqOy+iSd3pN+9fGP9b5y0ju/6fZCd3vO7EQq75SCyS9lJm/NrnLWkZFjwunsr0Gsxb/9xu43/sfBwL54017+lodNlc5x8DTb7y7pBxG9f2PMwL145tKUXX/G0e9vRsEZjvHjs1iZO2vRL/C7qE189wYt3LlmKiqrjDbG78zKn1IiZFqabJvnDDqf1e8FJu7jr9178MeqEVqfS6uF934qZ9sPre3lxYyQ+XPD7a3s604/u+4YXd680zosbZebELOO3He6A3wkjr/Ditlf/FJk9aXimS0REFBI2ukRERCEpc93LmXX8bpy5d3Zw0uZ1fsqLp0Q8U7vTHQu8OG+De9UalQ4Z1dyXEPx6R3cvntPHvSo5I3Al8qTAU8QGfHCxk6/j7X43cod1/tXG+Yhf9xrLvPirLL+LevJ/ejr56j3kX/l6YrV1cMW+Urciydi9kxf3rf2VkzZ/h/+krvozd4RWp8LU+S4whNUvffUorTJr1vTiahnuTvfLrf723Pjh+LqUJdt/Stn2frs7aTc9/aIXH1x5ipOWLf7+YGKu36U8aO5pTr4rW3/pxcdX2+KkPXWiP3zwyIiTvDhvdvS7UUqKZ7pEREQhYaNLREQUEja6REREISlzY7p/ntXZi+ed5L5w+sPN/njvC8cd7qTlrXKfGkWlz7rjuzvT35z2Xy/OgPsi89Fb/XGb+y7y3/LU7kv3Uv9430IjWf6mkNGxrZP2/Pt1vfg/L//Pi7tXWhlRil/HTHGPZ7tP+KcXN11ZcdfFXwf7Ty06s/oqJ+3AmQO9uOank0Cl38LLu3nxgZVHO2ldvh3kxe0wLWYZwbcTzbu4kRfPPv3xaNkBAKO3VnemL/piiBd3enS1F+fMd7e1J+FfB/T46OZO2sed3vXie1v4t59Wmh2zGiXCM10iIqKQsNElIiIKSZnrXt6479aYaY8u9F+UXGV+xe3CK6s04r3y2zT2bTYb8/0nT/21r3+bwdaT93HytWu/POr3129zn2Z2Wkv/xdoX137FSZu83S+/d07wZiO3yzvoh23uTUlN7/LnRXNzI7NXGFcc/YkXB28RAoBKT9YLTHH7LQtk99i3X2b/XiVmWlDwRQlz+/m3Bkbe1jdgwdFevOHapk5a+x/92/XiHVL6bUFj94NO0fMlG890iYiIQsJGl4iIKCRlrnv5jd7DA1PuMcPILv5LLfd/6ConrfWH2704c8xUUOlT5wP3AfgXDBrgxa92cl9Yenw1/ylUp/zbfxJZnsZ+1lSu+g84z5HCVn03ze1S9u2M6MjqO/NML657sZumC8J5V2dZ8uyag53pyh9PTFNNqKQ6NVxR7O9Iz67O9HsHPh2YyvairmMucPK1P9d/upxsm1Hs3y3KLSv99/BWHvOzFxfn6XXx4JkuERFRSNjoEhERhYSNLhERUUjK3JjuPjl+n/8OdcfN6mT4t4HMPcN9K82O0/283UZf6MW1Jrm3jmxq5o8V1vRfTIT6MzfHrNPq3d234zQa4z+pKI+3LsUtf+NGZzrnCH/6gkYnO2lzbmvlxUf09Mdf5q9v6OT7Y1l9L86s5K8Dx3ec6eR7oPFkFFeXb90xp45X+W8j2rki8mlVFVNm7VrOdI2MpWmqCaVCs6r+27QyIs/hRBHN/KHui+U7Z/v79J6TzvLitgPcp1gle2w1u/p2Z3rzTr9e+du2RWZPGp7pEhERhYSNLhERUUjKXPdy64/O9+L5xz0T9/eCLzmed9hzfsJhSamWY+L1/tOHLp8duI3kuOS+DLkiyYvoru3wb396UeDzSvjDydc+YrrAl+91caYL615etNN/2fWJj1/rl/2Ie4tL3s6dINfSc93bQwbU+NaLp25uFXJtii/3mPUx07bkV4qZVlHkq3/elh/ZARzjiXJNGq1zpoPf69LAvwVpbRLqFyn4coVZB49w0g6eeboX10zhE9F4pktERBQSNrpEREQhYaNLREQUkjI3ptvxYv8y8iPfcW/ZGPTER15cNcN9k8txVf0XZgfHd1Nhnxz/Uvlxe77mxV3/M9TJ1/aaH1NaD3ItvGd/L56698MRqbHH5059wB/H3e3J8V4c/YYIKst2HtLTmX5zzycCU+6tLu/d77/VrBZ+SmW1ypXa57q340wY698y9EQLfx++//1XO/k6POZfn7Fz2Z8l+u3Ob/llrMhz31hX+dG6gSmO6RIREZV5bHSJiIhCUua6lzVwW0b211OctDc67Rbze4+d6t+6k5ftX8p+wNXubR/3NZ6UaBUdwae0NOsR/YXqlDp/XnOAF38x4AEvriKxX0D/6Np2znTjF6d7cbKfikPpF+xS/vsy98lznbL9LuWLlvV20mq/5b+trKIMNQRvuQGAg2t9U+wyIruG7z/sRC/uMcp/DOAvZz3m5LuoTz8vXn5sXSctb83fXrxuoD+MdODlE5x8tzT6wYt7vul2X7f9PJwhAp7pEhERhYSNLhERUUjKXPdySVUbOSHq5x/12N+Zvm+g3728Rf0HYvf8/t9OvpbP+1dArx66xUmbvLf7wnUKz44jejnT71/idym3yIrdpbw48NSpD6871EnL2ZLcIYeKpOYi96Ukwad7pZNk+bu+dVf4L9aYvNebTr6vtlbx4vk3u0/XqrSj+C/JKOvyflvoTL/51z5efFLbz520lgcu9uLMmjX9MjZscPLtXLDIi6fs6Z8HHjzQvduj7kz/SVZSf4eTtvCJ5l4862D/ivPIK5SDXcptr07PFec80yUiIgoJG10iIqKQsNElIiIKSYUZ042lxRfuk6sw0A+riv+Uojl9XnCztTzciz9t9UVEqdGPZRb/5V7m3t55Pw4lw6Lj3KeNtYoxjrs8zx1bHHT5VV5c9ZPo4/9UfNVGuX/Lz+/s7MVtK69y0n5t1s2Ldy5dlvBv5x+4hxcvvMhNO6WzfxvYPQ3dcdyge64e7MVVvpgYM19Fte08f6z2oVGdnLSPO33gxZeN9m+3mviMex1N9T+jv51r1d7uDXp7D/VvJ3pwt3FOWvDWzOHrW3nxS/89zsnXdkT6nwLIM10iIqKQsNElIiIKSYXvXs6e/Kszvd/Uf3jxT3u9EfN7r7T6KjDlHrvkqn85+3GBl9h3Guo+RNu9mYJKKrOe320/7eRHIlJzEE3fcZc4023fY5dy2C6q7d5+suJjv6ty8t8tEi7/vtbDvXiPSrF3dVO2+1viwInnOmltv5nrxdxed5U339+nfX+Ce0tVnU/8p3s9vNtYP+GOsYgl2E2cX4znv3Ubd7YXt7tytRfXXZb+7uRIPNMlIiIKCRtdIiKikLDRJSIiCkmFH9PN37jRmW58aR0v7j/ieC++sdUnTr79c/wRnlGb6jtpN316hhe3u8J/1BjHhJIns46/nC6f4I8RVZfoY7gAcP8a/3aV9ue7Y/l8e1A4grdwrLzseyft9gYz/IlgXGL+7m1nxNY3w3/CK856y3/cYOvr3TFAbrPxCz7OEQDe7+vfAvbY2f6bhDa3dh/h+MVR/nUYR35xuZ9QyKubOj6/zZluNWmmX494KptGPNMlIiIKCRtdIiKikFT47uVIOxf5b8bAIX44dKj7SJuNe/tvr+g0bLWT1u6P9Ly9oiJZfbz/9Jsjqn7rxXmFdEl9entfL662mbcIpUPdwBOBJn3fwUl76H2/y/DKOm73f0l0+u4cL670s/tksmb3jvfi1ih9t5WUB3krVnpx0/tWxsx3KfynVXVAfG/0KmQzL/V4pktERBQSNrpEREQhYfdynBo9Nt6dDsSl/Wq58uiUq7/24jyNfe1xu48u9OIOo9ilXJpEvhD96241/Bh7JVx+G0wvOhNRyHimS0REFBI2ukRERCFho0tERBQSjulSmdSjin9rV6b4x44/bXOfIdTlAf9WBY69E1G68UyXiIgoJGx0iYiIQsLuZSqTLn/Nf9n43POf8uJzRlzq5Gu+wL3Vi4gonXimS0REFBI2ukRERCFho0tERBQSjulSmdTyVn+s9shb9/Di5uAYLhGVXv9v777DpCjSP4B/X3ZhlyRJAYlLFAmSREwkRUVPUE64E1EMhxye6QzonQlEPb3zfuZ4CmI6AyoCPmcG7vQQCQIiggFYBERBlKykfX9/VG9119zM7OzObO3Cfj/Ps8/z9lRNTfd2V1d3VQee6RIREXnCRpeIiMgTUd2fXwdMRES0/+CZLhERkSdsdImIiDxho0tEROQJG10iIiJP9vtGV0TGicgeEdkuItVT/M4KEdktIs8lyaMiskNE7sjc3JaOVJZnfyEik4JlyU8xf9tg3e8TkZEJ8vQVkYIg34CMznCGiUj/YD4LRKR/Wc9PJlT0OioiOcGy7xGR28t6ftLFOlr08iRTLhpdETlcRGaIyBYR+VpEBheziJdUtYaq7gjKqy0iT4vIhuBvXDSzqrYC8JcUyu2sqjdG5nOgiHwW/MNni0j7SJqIyO0isi5Yjlki0iHB8jYLyoj+qYhcE6R3FpGlIvKDiFwV+V5lEflYRJqWcHm8EJG6IjIl2CGuFpFzilnE31Q1L1JejohMFJGtIvKdiFxdmKaqX6pqDQAfFFHmt8E28lZQpojIjSLyTVDuiyJyUOQ3G4vIVBH5UUTWisjoJMtbVFljgnX5mYh0jHx+nIi8Hi1LVd8LlucblCMicpmIzBeRXSIyqQRFxNbRfiIyM6gr+bGZS6mO5ojIvSLyrYj8JCKPiEjlRAUXUdaJIrJKRNaLyG8jn9cWkU9EpGZkWXYF6/T5FJbHi2D/9Etk//NFMYuIraOFDXF0n5YFlLyOBuVeHvyftwbb3/GRtDdjfm+3iCxJsswjxbQv20XkLRFpFEk7J1iXq0Skb+TzVsG6zyr8rBjLE1eZN7oikg1gKoA3ANQFMArAcyLSNo1i7wVQDUAegKMAnCciF6Y5n21gKs1oALUBTAcwLZh/ABgK4CIAvWCW4yMAz8YrS1W/CTauGsHK6wSgAMCrQZY7AVwLoDOAm0SkYfD51QBeVdU16SyLBw8D2A2gAYDhAB5NdACSonEA2gBoDqAfgOsk/aPhEQDOA3AcgEYAqgJ4MJL+HIBVMMvwKwB/EZF+xS1LRA4F8DsALQE8BuCu4PNsAP8H4I9pLocv3wK4HcDEDJW3IyhrTIbKS6WO/gnAkQA6AmgLoBuAm0pY1n0ABgIYALN9F+6U7wRwl6puy9RylaLLIvuhwzJQ3t+i+zVV3ZdOYSLSE6a+DAFQC8AEAFMijfmpMfvR2QAmJyirD8xB3Bkw++dVAF4I0rKD3+kG4HIAD0W++gCAq9Ndlqgyb3QBtIPZUd2rqvtUdQaA/8LsxEpqIMwGsFNV82FW1kVpzucpAD5Q1Q9VdS+AvwJoDKBPkN4CwIequjJYQc8BaB+/qP8xAsB/gnktLGuGqq4D8BWAZiLSDMBZMAcU5ZaY7sOzANysqttV9UMA05De+hwB4DZV/UlVlwF4AsAFac7qQAATVHWNqm6HWZ+/FZFqIlIDQF8Ad6jqHlVdDOAVJN6GEpYFoBmAhaq6FcB7MI0vYBrbaZF1Xq6p6muq+jqATRkqb66qPgtgZSbKCxRVRwcCeEBVf1TVjTA71ETrtKiyqqvqZ8G2sRtAPRE5CkALVX05g8tUkeUBWKqqC9Q8UOIZAAcDqB+bUUTyYE544p7owKz7yaq6VFV3A7gNQG8RaQWgHoB1qroekToqIkOCz+dkcqHKQ6MrCT6LdsNtjnYrlKBcp7wSkjhlRst9EUBrMf39lQGcD+AtpGYEgKcj058BOFlEmsBseCtgdhDXqeqeEi+BH20B7FPVLyOfLQbQAbBd65uDg4giiUgdmIOyxfHKS0O89ZkDc0Ytkc+i6Ym2oWRlfQ2gk4jUBtAfwFIxwwNnA/h7mstQbpSwjmZ8NpC8jsZLbyIitUpQ1gYxw0CdYXqpfoI5+70i3YXw6M5g2OO/MV2qxaqjEX8QMxyzQETOysD8vQkgS0R6Bme3FwFYBOC7OHlHwBwkrUpQVrz1CZj1uRHmoKkJgJNg6mgNmF6QP6e/GK7y0OguB7ABwBgxY5YnwxxNVivMoKq1gzOmVL0F4E8iUlNEWsOsrGpFfKco7wLoI2bAvwqAGwBUiZS7HqaP/wsAP8N0N18Vr6AoEekF04X5SuTjawFcAnOGeBVMt+U2ACvFjDP+W0SGprk8paUGgC0xn20BUBOwXeu1VTXVMcsakTL+p7w0vAlgpIjkBTvd64PPqwVdg/8FcLOI5IpIN5iz90TbULKyNgG4A8AMmG7qawHcH+QZHKzLqUGF32+VoI6WhqLq6JsArhSRQ4Ihm8IGMt56Laqs0TDr8R8wvTiXAHgfQK6IvC1mvLpPnHLLi+thzugawyzD9OCsryR1FDAnBW1gzkJvBjBJRI5Lcx63wQy5fQhgF4CxAEZp/McojgAwKUlZ/wLwGxE5QkSqArgFgMLU0QKY9fcKTP28GMB4mCGiTsG6fFsi12Oko8wb3eDM7UyYHdJ3AK4B8DKAtWkUewVMw/cVzHjxC8nKixmQH55gPpfDnL0+BNPAHgzg80i5YwH0ANAUQC6AWwHMCLoYkzkfZpx2e+S3VqvqaaraLZj/8TAbw98BvARgEIB7RKRuEWWXhe0ADor57CCYClTS8grLSKm8mIsrEh2tT4TZLmYBWApgZvB54focDtPNvwbAozDje4m2oaRlqeoLqtpNVU+FObLeBWAhzPocCDMOdcCc9ZaGDNXRO2D+74tgxv9eB7AH5qC/WGWp6iJV7auqPYPPL4IZM3wSpu5fCOBZEYnXk1fmVPVjVd0WXOT1NMxB5mlplPeJqm5S1b2q+i+Y+vLrRPlTrKMjYf6vHWAOeM4F8Eb0AqigrOMBNIR74hI7f+/D7KNfBbAaQD7MPqRwfb6vqkerah+YnosjYRrxZ2GGsm6DWbdpK/NGFwBU9VNV7aOq9VT1FJgjsLlplPejqg5X1Yaq2gFmOROWFzMgn/AKQ1V9RVU7qmo9mBXYHMC8ILkzzBWaa4MNbxKAOkgyrhsccQ2F27Uc6xYAT6rq9zAXXM1X1S0wG0vrJN8rK18CyA4uRCnUGaYxKjZV/Qlmp9c51fJiLuaIe7SuqgWqOlZV81S1SVDeuuCv8MDndFU9JNix1kOCbaiosgoF6/svMAeWbQCsCcZ65wE4ouj/RsWViTqqqj+r6mWq2lhVW8KMTy/QBBfJFFHfo+4FcJOq/oywjuYDqAzgkBIvtF+K+EN9pVJeKnUUpp5PV3O1cIGaq5rXAzg2Jt/5AF6Lnrgk+M2HVbWNqtaHaXyzYYbyrOAg6SGYE7eDAWSp6mpksI6Wi0Y3OOXPDS5iuRbAoUjeVVBUea1EpJ6IZInIqTBXRKd9f5yIdA/KPATA4zAbxPIgeR6AoSLSQEQqich5MJXu6yRFDgawGeGZUezvtYe5oOfR4KNVAE4QkQYwO+1ydVsJAKi5JeQ1AONFpHrQxXQGEl/gkIpnYK7iriMi7WC6fyalM59ibmtqJUZ7APcAGB90NRXexlZTRKqIyLkATg7yFLusiJsATFLVb2HW3WHBuuyHzF5QlHEiki0iuQCyYMbZciW8krck5VUKyqtsJiU36MZNdz4T1lExt4E1CtbT0TDdoGNLUlYkz0kAclX1jeCjwjraAWZcPyMXnmWSmNuaTilch0HPQW8Ab6dR5hARqRGs15NhzkqnpTmr8wD8SkRaBuvsJJhrRmxDGTlxmVTE/OWKSMegnGYwXer3Bwf1USNhLnxcBLPuqgZ1OnN1VFXL/A/A3TAXImyHGXdpHZO+HUCvBN8dB+C5mM9+A3OLw06YrqRTUvleTLrGmY8PYbokfoSphNUjabkwt8qsB7AVwCcABkTSHwPwWEx5b8NclZtoHmYC6BmZ7gzTlfUDzGXsKS+P5/VZF6brbgdM43JOJK1ZsD6bJfjuJAC3x3yWA9OFuxXA97HLHuSZBWBkgjL7Algb81lbmPH3nTDdTbH/zz/CXGCxI1jvRybaJosqK8hzGMxOJDvy2ZhgXX4OoFNM/nwA/ct6XcZsXxrzNy7e/yPBd2PraN845c0qzjZdgjraO/i/7gzW1/CY774J4IZUyopsl4sANI98dmLwG+sBnF3Utl1G6/KQYFvcBnPQPwfASZH0ktTRD2CutdgKc6Hj2XG+NwvFq6MCM7T2TTCvywCcF5NnWFDnJE6ZSwvXMcxtX5/C1OfvYG7tyorJfzBMg35Q5LPhQf58AP1SXZ6k//+y3gAysAHdFPwjN8dWiiTf+SLYqCYmyfNLsBElbBTLy18qy7O//MHcDrQdwIoU87cJ1v1OABckyNMbZox/M+IcgJWnv2CnvTmY335lPT8ZWqYKXUeDxnlz8D8YW9bzk4Hlqeh1tMjlSfbH9+kSERF5Ui7GdImIiCoCNrpERESelPjqw5I4qdJQ9mWXkXcLJmf8fkGuz7JTGusT4DotS6yjB5ZE65NnukRERJ6w0SUiIvKEjS4REZEnbHSJiIg8YaNLRETkCRtdIiIiT9joEhERecJGl4iIyBM2ukRERJ6w0SUiIvKEjS4REZEnbHSJiIg8YaNLRETkide3DBERZdLX9x5t4xW/fcxJG7G6t42/P2art3mi4tl7QncbrxocNknXnPgvJ9+oWvk2rgT3BT4FCF+mNHZDVxtPz+/o5Gt0Z1Y4MXdJieY3XTzTJSIi8oSNLhERkSfsXqYDWnbDBjbeclyejded5L7be9Wgf9h4j+5z0o5bdLaNN66pY+P2d33n5Nub/01a80rFd9zRnydMe6b5f2zca/DvnbRqUz4utXmqqNZdf6wzvaPNbhsP6z434fdurR/WvQIU2LhSzDlhNO3wWaOctPrTcmxc86U5Nm6ExNtHWeGZLhERkSdsdImIiDxh9zLt9yQn7FpaeWs3J+2hIU/auE/VnQnL2KPh8We0GwsAPujyz3CiSySsd5GTr9nQlGaXMijahZzMt73dq11bTymNuanYFl/xkDMdvaL4+30/2/iRTW43dNs3w67/6l9VsXHuD+4QUL0JH9m4FRamN7NliGe6REREnrDRJSIi8oSNLhERkScc042xr284Jph9y/c2nn7YNCdfZQmfbJLsFpN6N1a2seSvc/JtGtjexnVf/8xJK9i2rTizXaF9MyZ8os2S8+4vURkXrj7RxhOav5vSdxYdO9GZHoQeJfptKn2tr5pTdCZKS+8lQ5zpGZ1esnF0HHdBV/dcry3ml+6MlTM80yUiIvKEjS4REZEnFbJ7OXqLybZBXZy0sXeGXYbRW0zcm0iAPZGr2ZPdYtLt5gts3Lmhe4wzNS+8xL5H7cudtAYPzo4/8wQA0GM623jiRQ8W+/tHPHWFM93itk9s3O7eS5205Wc8XOzyiSqa2hfvdqbfeL+ejc+svcDGiw4/x8m3b9lXpTtj5QzPdImIiDxho0tEROQJG10iIiJPKuSY7q6+nWw8476HEuab+XMNG99yu/vIv8o7NTa7tbV5eCxTJfLkweuudW8x2VKw18Y11ru3HZErOoYLAHr7jzbuHg7R/8/Y+5Tt9W088YJBNs772H3riRaE///DrlrspJ36+iU2vu2x8I0oR+a466z/Z+FtXu91rBm7CFQKWr002saxL7GPir7sHuAtRKVh75q1zvSfpgy38efnhvvZ3Q3dupG1rHTnq7zhmS4REZEnbHSJiIg8qTDdy9HuyTsffTxhvmErTrPx1rFNbVxn5kfxssdVq3ULG3eZvMLGh1dxj3HaTb3Kxm1f4Uu1k9nQo7ozPa9d2FUffTrYlgL3toWxL4dPB8v7KLV1qLt2OdOV3wmfmHPu22F35tKB7tDEmLrhun7ihfOdtBbD3C5ryoxkXcpUxiIvdqoUmdjUIdfJVle6IxU588Nbi/Zt3ZrevJUhnukSERF5wkaXiIjIkwrTvfzTjeFLlKNXu562/NdOvqxrDwrjhZ+gJDZ3b2DjsfVfTpiv6TslKr5CqtR/kzMdfQpY9OlgF64c5OTLuzn1YYFUtL0kvOr5weM7OGlX111u4+Ht5zlps1EFRAey7KZNnOm7znzextEX2s/5s/tSkkqRc79ova4Uc07Yd8lQG++a7Na96Avuyzue6RIREXnCRpeIiMgTNrpERESeHLBjuqtePMKZXtr1KRuv3RuO71a6sY6TTxd+Wuzfir61CABa//HzsPzIcU30RekAUPV196lI5Mpu3MjG1xz2XkrfWTm5jTPdABszOk9RE6f2d6avvnB5gpxEB6boOO5pb7u3xQ2q/pONx27oauPp+R2dfDqndtyyB539oTN9dctwH3Dm+M1OWsH4cMx4wHmjbBy9zQgoH7ca8UyXiIjIEza6REREnhyw3csj2rtdt9FL0VfvDW8LwpzidycDbpfyF/e5D+Of2ix86Xn0Afyr7z7MyVcNfApVMj8d38zGQ2pMTZhv1Jq+Nm4ceQIYsAwRMwAAB1VJREFUAOxF2ehY1X34+9yWJ9h478p8z3NDVDq2dwmHgEbVcuto709/Y+ODTg3rZSN8jlQs+Kt7Tri4SS8b3zSyuZN29IAlNn7r2fClJA9vbuXke/PCsAzMXYKywDNdIiIiT9joEhEReXLAdi9nWlYHt2t42eW1bLx84MOx2a3oO3lrzl7lpPENuslt7CZFZwKw4q7DbVz1u/JxRfjp1d0naN1zZEMb12D3snd8f27pyJ0e1rfTp7svLjgIK2Kzp2Xv2nU2bjZunZP27bgw7nr95TaOvQL6tpfCF6X8+XejnbTsGQsyMJdF45kuERGRJ2x0iYiIPGGjS0RE5MkBO6b76qouzvSYeuHl4V1zdti416e/pFTeUdVec6b7VQ2/VxCbOeKaxUNs3OT7pSn9Fhn7qiV+40hUeXmyV2XJsnH0zUdE5E/jv8628eLnmzpph769xcbjn3zCSbvyjkttXJpvLeKZLhERkSdsdImIiDw5YLuXG57rXlI+6PXBNn6jXfjklGi3c3H0ilyWXjDMvT3kgy7/tHH9J6qVqHwCjjgi38YFSTvxy4c9Gt4Etj/ML9GBLnqbEQBMvuEUG68f595G9shND9j4/KZX2rjZuNnIJJ7pEhERecJGl4iIyBM2ukRERJ4csGO6Bdu2uR+cGE6fMPgPNt7QPfFxR51l4X0ftZ53+/83PrvLxsu7vOikTdiSZ+NqS9fbuKzeeEP+rd6725muunF3gpxE5EvVqeHthYsXJL6daNHF99t40LgeGZ0HnukSERF5wkaXiIjIkwO2ezmZalPCl8fnTSlZGctPeNLGsbeHPPxFHxs3WpPaC5tp/zPyzHcSpp3x1BhnutnMzN52QMaI1b1t/Ezz/yTM9/W9RzvTfOsQxd5O9MDifjYe3Wdlqf0uz3SJiIg8YaNLRETkSYXsXi6J2JfYA+ELj2OvVG3wQK6HOTrw7bilkY3nP5XlpB2ZEz796ZvJnWzcbGjJnjBWEj2qrnKm5+4SG+fdvdhJ4/OpiMqZozo5k88ePcHGD29uVWo/yzNdIiIiT9joEhERecJGl4iIyBOO6aZo5dgqCdOGLhzpTDec+Ulpz06FUOnfC2186X2XOWnzrn/Qxu/2fNTGF/S7wsmXleF1serFI2x8XO4CJ+3YhcNsXHfHlxn9XQrtHNzTxs80f7wM54SiVt96rDOd+0MYN3iwfNwyl9W+rY23jt/hpDXJ/tnGb13QK5KS2etEeKZLRETkCRtdIiIiT9i9nIQe09nG03o+EpMa3hYk79fxNEcV16GzfnSmjzzhXBvP7/Gcjdf2dW/Xaj4z/d/ecVbYnflyz/BF1x/tynHy1b2dt4r50OK6ZWU9CxTY9LtjbLxk5INO2uGzwmG3Bm5S2rKbNnGmV5/TLG6+lqe5T5a6oekLNp7zs3tb0OBx4VPk6s77KN1ZTIhnukRERJ6w0SUiIvKEjS4REZEnHNNNYkOP6jZuke2O10XfLJT9i4JKV8Gny53pxjeGj+WcMqWujaddcLeTb8DBV9u4zaUfIxHp3sHG3x9Ty0l7/JrwhdaHVwmPU9tNH+XkaztnLijzorcIAanfJtTr0t/buPUUvlWotFUW91Gty/qGb2JbuCrcX57z0cVOPonEvVt+beMvNtd38s3sNNnGleDeClgAjaSFJT6yuYWTb9iMcJtoP269k1Z3bemN40bxTJeIiMgTNrpERESesHs5iV8ODrssYl9Uf9+P7W1c7wk/3RIU2rf0Cxs/PSB8+fTj/3DX01un32Pjl3t1t/GL/zzByffkqPCehq45id8JNODzITZu9+g2J41vEvKv1UujbRz7YvpqSDycQJlRb0K47zt2x2gnbcPAXXG/8/QxE5zpo3LC/Wz07T4FTsezewtSwSb3CYEtp+yJ+1tVFnztTLfdOt/Ge+N+o/TxTJeIiMgTNrpERESesHs5iXPPTPw4o4lT+9s4D+xeLkt7V+bbOGfYIU7a6K5X2rjy9d/ZeMHl9zv52k2/NGH5LV4LO45zZn5q44I9u4s9r1R81aa43cSnTOli49bgVcnlRc0X58RMx883Ht1SLNEdvmmFhQnyJbav2N8ofTzTJSIi8oSNLhERkSdsdImIiDzhmG4Sr64Kx47G1Mvsi4ypdOzbuNGZrvxOZPqdMByEHk6+tkjtaVJ89hgRpYNnukRERJ6w0SUiIvKE3ctJ6Pvhg/RvaOI+dL3B/PJ4MToREZVnPNMlIiLyhI0uERGRJ2x0iYiIPOGYbhINHpht488ecNOqpniLCRERUSGe6RIREXnCRpeIiMgTUeUzdoiIiHzgmS4REZEnbHSJiIg8YaNLRETkCRtdIiIiT9joEhERecJGl4iIyBM2ukRERJ6w0SUiIvKEjS4REZEnbHSJiIg8YaNLRETkCRtdIiIiT9joEhERecJGl4iIyBM2ukRERJ6w0SUiIvKEjS4REZEnbHSJiIg8YaNLRETkCRtdIiIiT9joEhERecJGl4iIyBM2ukRERJ78PyHVoaWHc8vmAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型结构的理解"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "这里建立了一个拥有一个线性层的softmax回归模型步骤如下：\n",
    "一、构建计算图\n",
    "1.通过占位符x,y为输入图像和目标输出类别创建节点，来开始构建计算图。\n",
    "2.从截断的正态分布中输出随机值为模型定义权重W和偏置b。\n",
    "3.使用L1正则构建损失函数 y=x*w+b ，并使用激活函数激活输出\n",
    "4.对3的输出使用L2正则再构建损失函数实现回归模型\n",
    "5.使用softmax将详细函数转换成10个数字的概率分布\n",
    "6.计算交叉熵损失的平均值\n",
    "7.利用梯度下降法对交叉熵损失进行优化\n",
    "8.类别预测\n",
    "9.计算准确率\n",
    "10.定义每次训练的样本数和训练次数\n",
    "11.保存模型\n",
    "二、模型训练\n",
    "三、评估模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练过程的理解"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "通过GradientDescentOptimizer随机梯度下降法计算梯度，每迭代一次自动更新一次参数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 计算图的理解"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "计算图由一个个的节点组成，每一个计算都是计算图上的节点，节点与节点之间的连线代表着计算之间的依赖关系。\n",
    "计算图的使用分为定义计算阶段和执行计算阶段两个阶段，定义计算阶段是用图描述一系列可交互的计算操作，这个阶段是没有运算结果输出的，只有执行调用session执行运算才是真正的计算，这样的方式\n",
    "不便于调试，运算效率高。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型效果认识"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "对于数字5和6的准确度只有百分之七八十，所以模型的效果是非常不足的。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
